#  --------------------------------------------------------------------------------
"""
首页，详情页面

我们都是先查询数据库的数据
然后再进行HTML页面的渲染

不管是  数据库的数据缓存  还是 HTML页面的渲染(特别是分类渲染，比较慢)    多少会影响

最好的体验 是  用户  直接  就可以访问到   经过数据库查询，已经渲染的HTML页面   (静态化)

经过数据库查询，已经渲染的HTML页面，写入到指定目录

"""
#!/usr/bin/env python

# import sys
# import os
# import time
from apps.goods.models import SKU
# import apps.goods.models
from apps.contents.models import ContentCategory
from meiduo_mall.settings import BASE_DIR
from utils.goods import get_categories,get_breadcrumb,get_goods_specs
# import django
from django.template import loader
from django.conf import settings
from apps.goods import models
# from utils.goods import get_categories
# from utils.goods import get_breadcrumb

import os
sys.path.insert(0, '../')
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mall.settings")
import django
django.setup()

# 这个函数  能够帮助我们  数据库查询，渲染HTML页面，然后把渲染后的HTML写入到指定的文件

def generate_static_sku_detail_html(sku_id):
    """
    生成静态商品详情页面
    :param sku_id: 商品sku id
    """
    # 获取当前sku的信息
    sku = models.SKU.objects.get(id=sku_id)

    # 查询商品频道分类
    categories = get_categories()
    # 查询面包屑导航
    breadcrumb = get_breadcrumb(sku.category)

    # 构建当前商品的规格键
    sku_specs = sku.specs.order_by('spec_id')
    sku_key = []
    for spec in sku_specs:
        sku_key.append(spec.option.id)
    # 获取当前商品的所有SKU
    skus = sku.spu.sku_set.all()
    # 构建不同规格参数（选项）的sku字典
    spec_sku_map = {}
    for s in skus:
        # 获取sku的规格参数
        s_specs = s.specs.order_by('spec_id')
        # 用于形成规格参数-sku字典的键
        key = []
        for spec in s_specs:
            key.append(spec.option.id)
        # 向规格参数-sku字典添加记录
        spec_sku_map[tuple(key)] = s.id
    # 获取当前商品的规格信息
    goods_specs = sku.spu.specs.order_by('id')
    # 若当前sku的规格信息不完整，则不再继续
    if len(sku_key) < len(goods_specs):
        return
    for index, spec in enumerate(goods_specs):
        # 复制当前sku的规格键
        key = sku_key[:]
        # 该规格的选项
        spec_options = spec.options.all()
        for option in spec_options:
            # 在规格参数sku字典中查找符合当前规格的sku
            key[index] = option.id
            option.sku_id = spec_sku_map.get(tuple(key))
        spec.spec_options = spec_options

    # 上下文
    context = {
        'categories': categories,
        'breadcrumb': breadcrumb,
        'sku': sku,
        'specs': goods_specs,
    }

    template = loader.get_template('detail.html')
    html_text = template.render(context)
    file_path = os.path.join(os.path.dirname(settings.BASE_DIR), 'front_end_pc/goods/'+str(sku_id)+'.html')
    with open(file_path, 'w') as f:
        f.write(html_text)

if __name__ == '__main__':
    skus = models.SKU.objects.all()
    for sku in skus:
        print(sku.id)
        generate_static_sku_detail_html(sku.id)